package com.mrogrape.notepad.resource;

import java.awt.Dimension;
import java.awt.Font;
import java.awt.Frame;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.LinkedList;

import com.mrogrape.notepad.activity.entity.ViewSettings;
import com.mrogrape.notepad.common.ViewUtils;
import com.mrogrape.notepad.ui.find.FindDialogSettings;

public class Settings implements Serializable{

	/** serialVersionUID */
	private static final long serialVersionUID = 1L;

	/** Settings Folder */
	private static final String SETTINGS_FOLDER_PATH = "Mrogrape Software/Notepad";
	private static final String SETTINGS_FILE_NAME = ".settings";

	/** Settings Object */
	private static Settings settings = null;

	/**
	 * 获取用户配置
	 * @return
	 */
	public static Settings getSettings(){

		if(Settings.settings == null){
			Settings.settings = new Settings();
		}

		return Settings.settings;
	}

	/**
	 * 加载用户配置
	 * @throws FileNotFoundException
	 * @throws IOException
	 * @throws ClassNotFoundException
	 */
	public static void loadSettings() throws FileNotFoundException, IOException, ClassNotFoundException{

		ObjectInputStream ois = null;
		try{
			ois = new ObjectInputStream(new FileInputStream(Settings.getSettingsFile()));

			Object obj = ois.readObject();
			if(obj instanceof Settings){

				Settings.settings = (Settings) obj;
			} else {

				Settings.settings = new Settings();
			}
		}
		finally{
			if(ois != null) {
				ois.close();
			}
		}
	}

	/**
	 * 保存用户配置
	 * @throws FileNotFoundException
	 * @throws IOException
	 */
	public static void saveSettings() throws FileNotFoundException, IOException{
		ObjectOutputStream oos = null;
		try{
			File file = Settings.getSettingsFile();

			if(file.exists()){
				file.delete();
			}

			oos = new ObjectOutputStream(new FileOutputStream(file));
			oos.writeObject(Settings.settings);
		}
		finally{
			if(oos != null) {
				oos.close();
			}
		}
	}

	/**
	 * 获取用户配置文件
	 * @return
	 */
	public static File getSettingsFile(){

		String folderPath = System.getProperty("user.home") + "/" + Settings.SETTINGS_FOLDER_PATH;
		File folder = new File(folderPath);

		if(!folder.exists()){
			folder.mkdirs();
		}

		return new File(folder, Settings.SETTINGS_FILE_NAME);
	}

	/**
	 * 获取用户配置文件所在的文件夹。
	 * 
	 * @return 用户配置文件所在的文件夹。
	 */
	public static File getSettingsFolder(){

		return Settings.getSettingsFile().getParentFile();
	}

	/**
	 * 重置所有配置。
	 */
	public static void resetAllSettings(){

		Settings.settings = new Settings();

		// 最近使用的文件列表
		Settings.settings.resetRecentFileList();
		// 最后选择的文件路径
		Settings.settings.resetLastChoiceFilePath();
		// 主窗体状态
		Settings.settings.resetMainFrameSize();
		// 主窗体大小
		Settings.settings.resetMainFrameState();
		// 默认插入日期和时间的格式
		Settings.settings.resetInsertedDateFormat();
		// 编辑器字体
		Settings.settings.resetEditorFont();

		// 是否显示工具栏
		Settings.settings.resetIsShowToolbar();
		// 查找和对话框选项
		Settings.settings.resetFindDialogSettings();
		// 重置视图选项
		Settings.settings.resetViewSettings();
	} 

	/** Constructor */
	private Settings(){}
	
	public String version = null;

	/**
	 * 获取最近使用的文件列表
	 * @return
	 */
	public LinkedList<String> getRecentFileList() {
		return this.recentFileList;
	}

	/**
	 * 重置最近使用的文件列表
	 */
	public void resetRecentFileList(){

		this.recentFileList = new LinkedList<String>();
	}

	/** 最近使用的文件列表  */
	private LinkedList<String> recentFileList = null;;

	/**
	 * 获取最后一次选择的文件路径
	 * @return
	 */
	public String getLastChoicFilePath() {

		if(this.lastChoicFilePath == null){
			this.resetLastChoiceFilePath();
		}
		return this.lastChoicFilePath;
	}

	/**
	 * 设置最后一次选择的文件路径
	 * @return
	 */
	public void setLastChoicFilePath(String lastChoicFilePath) {
		this.lastChoicFilePath = lastChoicFilePath;
	}

	/**
	 * 重置最后选则的文件路径
	 */
	public void resetLastChoiceFilePath(){

		this.lastChoicFilePath = System.getProperty("user.home");
	}

	/** 设置最后一次选择的文件路径 */
	private String lastChoicFilePath = null;


	/**
	 * 获取主窗体大小
	 * @return
	 */
	public Dimension getMainFrameSize() {

		if(this.mainFrameSize == null){
			this.resetMainFrameSize();
		}
		return this.mainFrameSize;
	}

	/**
	 * 设置主窗体大小
	 * @param mainFrameSize
	 */
	public void setMainFrameSize(Dimension mainFrameSize) {

		this.mainFrameSize = mainFrameSize;
	}

	public void resetMainFrameSize(){

		this.mainFrameSize = new Dimension(640,480);
	}

	/** 主窗体大小 */
	private Dimension mainFrameSize = null;

	/**
	 * 获取主窗体状态。
	 * 
	 * @return
	 */
	public int getMainFrameState() {

		if(this.mainFrameState == null){
			this.resetMainFrameState();
		}

		return this.mainFrameState;
	}

	/**
	 * 设置主窗体状态。
	 * 
	 * @param mainFrameState
	 */
	public void setMainFrameState(int mainFrameState) {

		this.mainFrameState = mainFrameState;
	}

	/**
	 * 重置主窗体状态。
	 */
	public void resetMainFrameState(){

		this.mainFrameState = Frame.NORMAL;
	}

	/** 主窗体状态 */
	private Integer mainFrameState = null;

	/**
	 * 获取默认插入的日期和事件格式
	 * @return
	 */
	public String getInsertedDateFormat() {

		if(this.insertedDateFormat == null){
			this.resetInsertedDateFormat();
		}
		return this.insertedDateFormat;
	}

	/**
	 * 设置默认插入的日期和事件格式
	 * @param insertedDateFormat
	 */
	public void setInsertedDateFormat(String insertedDateFormat) {
		this.insertedDateFormat = insertedDateFormat;
	}

	/**
	 * 重置默认插入的日期和事件格式
	 */
	public void resetInsertedDateFormat(){
		this.insertedDateFormat = "yyyy/MM/dd HH:mm:ss";
	}

	private String insertedDateFormat = null;


	/**
	 * 获取编辑器字体。
	 * @return
	 */
	public Font getEditorFont() {

		if(this.editorFont == null){
			this.resetEditorFont();
		}

		return this.editorFont;
	}

	/**
	 * 设置编辑器字体。
	 * 
	 * @param editorFont
	 */
	public void setEditorFont(Font editorFont) {
		this.editorFont = editorFont;
	}

	/**
	 * 重置编辑器字体
	 */
	public void resetEditorFont(){

		this.editorFont = ViewUtils.createNewFont("Courier New", Font.PLAIN, 14);
	}

	private Font editorFont = null;


	/**
	 * 查看是否显示工具栏。
	 * 
	 * @return
	 */
	public boolean isShowToolbar() {

		return this.isShowToolbar;
	}

	/**
	 * 设置是否显示工具栏
	 * @param isShowToolbar
	 */
	public void setShowToolbar(boolean isShowToolbar) {

		this.isShowToolbar = isShowToolbar;
	}

	/**
	 * 重置是否显示工具栏的设置。
	 */
	public void resetIsShowToolbar(){

		this.isShowToolbar = true;
	}

	private boolean isShowToolbar = true;


	/**
	 * 查看是否显示行号。
	 * 
	 * @return
	 */
	public boolean isShowLineNumber() {
		return this.showLineNumber;
	}

	public void setShowLineNumber(boolean showLineNumber) {
		this.showLineNumber = showLineNumber;
	}

	/** 是否显示行号的标记 */
	private boolean showLineNumber = true;


	/**
	 * 获取查找和替换对话框选项
	 * @return
	 */
	public FindDialogSettings getFindDialogSettings() {

		if(this.findDialogSettings == null){
			this.resetFindDialogSettings();
		}
		return this.findDialogSettings;
	}

	/**
	 * 重置查找和替换对话框选项
	 */
	public void resetFindDialogSettings() {

		this.findDialogSettings = new FindDialogSettings();
	}

	/** 查找和替换对话框选项 */
	private FindDialogSettings findDialogSettings = new FindDialogSettings();

	/**
	 * 获取视图设置
	 * 
	 * @return
	 */
	public ViewSettings getViewSettings() {

		if(this.viewSettings == null){
			this.resetViewSettings();
		}
		return this.viewSettings;
	}

	/**
	 * 重置查找和替换对话框选项
	 */
	public void resetViewSettings() {

		this.viewSettings = new ViewSettings();
	}

	/** 视图设置 */
	private ViewSettings viewSettings = new ViewSettings();
	
	

}
